#import "XHRTopicViewController.h"
#import <AFNetworking/AFNetworking.h>
#import <MJExtension/MJExtension.h>
#import "XHRTopicItem.h"
#import <SVProgressHUD/SVProgressHUD.h>
#import "XHRTopicCell.h"
#import <MJRefresh/MJRefresh.h>
#import "XHRRefreshNormalHeader.h"
#import "XHRRefreshAutoNormalFooter.h"

/** 定义重用标识 **/
NSString * const ID = @"topicCell";

@interface XHRTopicViewController()

/** 所有帖子的数据(里面是模型数组) **/
@property (nonatomic, strong) NSMutableArray * topicItemArray;

/** 用来加载下一页数据的参数 **/
@property (nonatomic, strong) NSString *maxtime;

/** 上拉刷新控件 **/
@property (nonatomic, strong) UILabel *footer;

/** 下拉刷新控件 **/
@property (nonatomic, strong) UILabel *header;

/** 是否正在加载更多数据 **/
@property (nonatomic, assign, getter=isFooterRefreshing) BOOL footerRefreshing;

/** 是否正在加载更多数据 **/
@property (nonatomic, assign, getter=isHeaderRefreshing) BOOL headerRefreshing;

/** 发送请求管理者 **/
@property (nonatomic, strong) AFHTTPSessionManager *manager;

@end

@implementation XHRTopicViewController

-(void)dealloc{
    // 移除通知监听
    [[NSNotificationCenter defaultCenter]removeObserver:self];
}

#pragma mark - 懒加载
-(AFHTTPSessionManager*)manager{
    if (_manager == nil) {
        _manager = [AFHTTPSessionManager manager];
    }
    return _manager;
}


#pragma mark - 初始化
- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.tableView.backgroundColor = XHRColor(215,215,215);
    // 设置内边距
    self.tableView.contentInset = UIEdgeInsetsMake(XHRNavBarMaxY + XHRTittleViewH, 0, XHRTabBarH, 0);
    // 去掉原先tabview的分割线
    self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;

    // 设置tableview滑动指示器滑动范围
    self.tableView.scrollIndicatorInsets = self.tableView.contentInset;
    // 监听通知
    [self setupNote];
    
    // 添加刷新控件
    [self setupRefresh];
    
    // 注册cell
    [self.tableView registerNib:[UINib nibWithNibName: NSStringFromClass([XHRTopicCell class]) bundle:nil] forCellReuseIdentifier:ID];
}

/**
 *  监听通知
 */
-(void)setupNote{
    
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(tabBarButtonDidRepeatClick) name:XHRTabBarButtonDidRepeatClickNotification object:nil];
    
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(tabBarButtonDidRepeatClick) name:XHRTittleButtonDidRepeatClickNotification object:nil];
}

/**
 *  添加刷新控件
 */
- (void)setupRefresh
{
    // 广告
    UILabel *ad = [[UILabel alloc] init];
    ad.textAlignment = NSTextAlignmentCenter;
    ad.textColor = [UIColor redColor];
    ad.text = @"此处应有广告..";
    ad.backgroundColor = [UIColor yellowColor];
    ad.xhr_height = 35;
    self.tableView.tableHeaderView = ad;
    
    // 下拉加载新数据的控件
    self.tableView.mj_header = [XHRRefreshNormalHeader headerWithRefreshingTarget:self refreshingAction:@selector(loadNewTopicData)];
    // 马上进入刷新状态
//    [self.tableView.mj_header beginRefreshing];

    
    // 上拉加载更多数据的控件
    self.tableView.mj_footer = [XHRRefreshAutoNormalFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreTopicData)];
}


/**
 *  tabbarButton被重复点击
 */
-(void)tabBarButtonDidRepeatClick{
    
    // 如果控制器界面不在正中间 (在正中间就是当前显示的View的控制器,这些控制器点击状态栏能滚到顶部的功能被打开)
    if (self.tableView.scrollsToTop == NO) return;
    // 如果当前控制器View不在窗口上
    if (self.tableView.window == nil) return;
    
    // 下拉刷新
  
    XHRFunction
}

#pragma mark - 加载数据
/** 在这里重写这个方法的目的：消除警告 */
-(XHRTopicType)type{
    return  0;
}


/**
 *  加载最新的帖子数据(首页数据, 第1页)
 */
-(void)loadNewTopicData{
    
    // 取消请求
    // 仅仅是取消请求, 不会关闭session
    [self.manager.tasks makeObjectsPerformSelector:@selector(cancel)];
    
    // 关闭session并且取消请求(session一旦被关闭了, 这个manager就没法再发送请求)
    //    [self.manager invalidateSessionCancelingTasks:YES];
    //    self.manager = nil;
    
    // 请求参数
    NSMutableDictionary * dict = [NSMutableDictionary dictionary];
    dict[@"a"] = @"list";
    dict[@"c"] = @"data";
    dict[@"type"] = @(self.type);//数字参数, 也可以使用NSNumber类型@1
    
    [self.manager GET:XHRURL parameters:dict progress:nil success:^(NSURLSessionDataTask * _Nonnull task, NSMutableDictionary *  _Nullable responseObject) {
        
        //记录maxtime
        self.maxtime = responseObject[@"info"][@"maxtime"];
        
        // 字典数组 -> 模型数组
        self.topicItemArray = [XHRTopicItem mj_objectArrayWithKeyValuesArray:responseObject[@"list"]];
        
        // 刷新数据
        [self.tableView reloadData];
        
        // 结束刷新(恢复刷新控件状态)
        [self.tableView.mj_header endRefreshing];
        
        
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        // 结束刷新(恢复刷新控件状态)
        [self.tableView.mj_header endRefreshing];
        
        // 如果是因为取消任务来到failure这个block, 就直接返回, 不需要提醒错误信息
        if (error.code == NSURLErrorCancelled) return;
        
        // 请求失败的提醒
        [SVProgressHUD showErrorWithStatus:@"网络繁忙,请稍后再试!"];
    }];
    
    
}

/**
 *  加载更多帖子数据
 */
-(void)loadMoreTopicData{
    
    [self.manager.tasks makeObjectsPerformSelector:@selector(cancel)];
    // 请求参数
    NSMutableDictionary * dict = [NSMutableDictionary dictionary];
    dict[@"a"] = @"list";
    dict[@"c"] = @"data";
    dict[@"type"] = @(self.type);//数字参数, 也可以使用NSNumber类型@1
    dict[@"maxtime"] = self.maxtime;
    
    [self.manager GET:XHRURL parameters:dict progress:nil success:^(NSURLSessionDataTask * _Nonnull task, NSMutableDictionary *  _Nullable responseObject) {
        // 刷新maxtime参数
        self.maxtime = responseObject[@"info"][@"maxtime"];
        
        // 字典数组转模型数组
        NSArray *moreTopics = [XHRTopicItem mj_objectArrayWithKeyValuesArray:responseObject[@"list"]];
        [self.topicItemArray addObjectsFromArray:moreTopics];
        
        // 刷新表格
        [self.tableView reloadData];
        
        // 结束刷新(恢复刷新控件的状态)
        [self.tableView.mj_footer endRefreshing];
        
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        
        // 结束刷新(恢复刷新控件的状态)
        [self.tableView.mj_footer endRefreshing];
        
        // 如果是因为取消任务来到failure这个block, 就直接返回, 不需要提醒错误信息
        if (error.code == NSURLErrorCancelled) return;
        
        // 请求失败的提醒
        [SVProgressHUD showErrorWithStatus:@"网络繁忙,请稍后再试!"];
    }];
    
    
    
    
}

#pragma mark - scrollView代理

/**
 *  当手势离开
 */
-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
    
    // header正在刷新(加载数据)
    if (self.isHeaderRefreshing) return;
    
    // 当偏移量 <= offsetY时, footer就完全出现, 进入上拉加载数据状态
    CGFloat offsetY = - (self.tableView.contentInset.top + self.header.xhr_height);
    
    if (self.tableView.contentOffset.y <= offsetY) { // 刷新header完全出现了
        
        //进入刷新状态
        [self.tableView.mj_header beginRefreshing];
    }
    
    
}

/**
 *  scrollView停止滑动
 */
-(void)scrollViewDidScroll:(UIScrollView *)scrollView{
    // 清除缓存
    [[SDImageCache sharedImageCache]clearMemory];
}


#pragma mark - Table view data source
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    
    // 如果没有模型数据,则不让footer显示
    self.tableView.mj_footer.hidden = !self.topicItemArray.count;
    return self.topicItemArray.count;
    
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    
    XHRTopicCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
    
    XHRTopicItem * item = self.topicItemArray[indexPath.row];
    
    cell.topicItem = item;
    
    return cell;
}

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    
    XHRTopicItem * item =  self.topicItemArray[indexPath.row];
    return item.cellHeight;
}



@end
